const JavaScriptObfuscator = require('javascript-obfuscator')
const fs = require('fs')
const path = require('path')

// 获取配置文件
const configType = process.env.OBFUSCATE_CONFIG || 'default'
const configFileName =
  configType === 'production'
    ? '../obfuscator.production.config.js'
    : '../obfuscator.config.js'

const obfuscatorConfig = require(configFileName)

console.log(
  `使用混淆配置: ${configType === 'production' ? '生产环境' : '开发环境'}`
)

// 递归获取所有 .js 文件
function getAllJsFiles(dir, files = []) {
  const fileList = fs.readdirSync(dir)

  fileList.forEach((file) => {
    const filePath = path.join(dir, file)
    const stat = fs.statSync(filePath)

    if (stat.isDirectory()) {
      getAllJsFiles(filePath, files)
    } else if (path.extname(file) === '.js') {
      files.push(filePath)
    }
  })

  return files
}

// 混淆单个文件
function obfuscateFile(filePath) {
  try {
    console.log(`正在混淆: ${filePath}`)

    const sourceCode = fs.readFileSync(filePath, 'utf8')
    const obfuscatedCode = JavaScriptObfuscator.obfuscate(
      sourceCode,
      obfuscatorConfig
    )

    fs.writeFileSync(filePath, obfuscatedCode.getObfuscatedCode())
    console.log(`✅ 混淆完成: ${filePath}`)
  } catch (error) {
    console.error(`❌ 混淆失败 ${filePath}:`, error.message)
    // 不要因为单个文件失败就退出整个过程
  }
}

// 主函数
function main() {
  const distDir = path.join(__dirname, '../dist')

  if (!fs.existsSync(distDir)) {
    console.error('❌ dist 目录不存在，请先运行 npm run build')
    process.exit(1)
  }

  console.log('开始混淆 dist 目录中的 JavaScript 文件...')

  const jsFiles = getAllJsFiles(distDir)

  if (jsFiles.length === 0) {
    console.log('未找到需要混淆的 .js 文件')
    return
  }

  console.log(`找到 ${jsFiles.length} 个 JavaScript 文件`)

  jsFiles.forEach(obfuscateFile)

  console.log('🎉 所有文件混淆完成！')
}

main()
